package com.lbz.common;

import com.lbz.utils.PropertiesUtil;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;

/**
 * 使用RedisPool操作Redis
 *
 * @Author 林必昭
 * @Date 2019/9/1 15:29
 */
public class RedisPool {

    private static JedisPool pool;         //jedis连接池
    private static Integer maxTotal = Integer.valueOf(PropertiesUtil.getProperty("redis.pool.max.total","20"));      //资源池中最大连接数 默认值8 建议值
    private static Integer maxIdle = Integer.valueOf(PropertiesUtil.getProperty("redis.pool.max.idle","10"));        //资源池允许最大空闲的连接数 默认值8 建议值
    private static Integer minIdle = Integer.valueOf(PropertiesUtil.getProperty("redis.pool.min.idle","2"));         //资源池确保最少空闲的连接数 默认值0 建议值
    private static Boolean testOnBorrow = Boolean.valueOf(PropertiesUtil.getProperty("redis.test.borrow","true"));   //向资源池借用连接时是否做连接有效性检测(ping)，无效连接会被移除 默认值 false，如果赋值为true，则得到的jedis实例是可用的，业务很量很大的时候建议设置为false
    private static Boolean testOnReturn = Boolean.valueOf(PropertiesUtil.getProperty("redis.test.return","true"));   //向资源池归还连接时是否做连接有效性检测(ping)，无效连接会被移除 默认值 false，如果赋值为true，则放回jedis pool的jedis实例是可用的，业务很量很大的时候建议设置为false


    private static String redisIp = PropertiesUtil.getProperty("redis.ip");
    private static Integer redisPort = Integer.valueOf(PropertiesUtil.getProperty("redis.port"));


    private static void initPool(){

        JedisPoolConfig config = new JedisPoolConfig();
        config.setMaxTotal(maxTotal);
        config.setMaxIdle(maxIdle);
        config.setMinIdle(minIdle);
        config.setTestOnBorrow(testOnBorrow);
        config.setTestOnReturn(testOnReturn);

        config.setBlockWhenExhausted(true); //连接耗尽的时候，是否阻塞，false会抛出异常，true阻塞直到超时，默认为true
        pool = new JedisPool(config,redisIp,redisPort,1000*2);
    }

    /**
     * 当在加载到jvm的时候，就要初始化连接池
     */
    static {
        initPool();
    }

    /**
     * 开放给外部类得到jedis实例
     * @return
     */
    public static Jedis getJedis(){
        return pool.getResource();  //从连接池中获取jedis实例
    }

    /**
     * 把jedis放回连接池
     * @param jedis
     */
    public static void returnResource(Jedis jedis){
            pool.returnResource(jedis);
    }

    public static void returnBrokenResource(Jedis jedis){
            pool.returnBrokenResource(jedis);
    }

    public static void main(String[] args) {
        Jedis jedis = pool.getResource();
        jedis.set("jacklinkey","jacklinvalue");
        returnResource(jedis);
        System.out.println("--------end");
    }

}

